/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.mudalov.rec.web;

import com.mudalov.rec.dao.factory.DAOFactory;
import com.mudalov.rec.dao.factory.MySqlHbnDAOFactory;
import com.mudalov.rec.dao.model.study.Material;
import com.mudalov.rec.dao.model.study.Question;
import com.mudalov.rec.dao.model.study.StudyProgram;
import com.mudalov.rec.dao.model.study.Subject;
import com.mudalov.rec.dao.model.study.Test;
import com.mudalov.rec.dao.model.user.Student;
import com.mudalov.rec.dao.model.user.User;
import com.mudalov.rec.util.webui.TestHelper;
import com.sun.rave.web.ui.appbase.AbstractSessionBean;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.faces.FacesException;

/**
 * <p>Session scope data bean for your application.  Create properties
 *  here to represent cached data that should be made available across
 *  multiple HTTP requests for an individual user.</p>
 *
 * <p>An instance of this class will be created for you automatically,
 * the first time your application evaluates a value binding expression
 * or method binding expression that references a managed bean using
 * this class.</p>
 *
 * @version SessionBean1.java
 * @version Created on 29.11.2008, 17:30:15
 * @author MU
 */

public class SessionBean1 extends AbstractSessionBean {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    // </editor-fold>

    /**
     * <p>Construct a new session data bean instance.</p>
     */
    public SessionBean1() {
    }

    /**
     * <p>This method is called when this bean is initially added to
     * session scope.  Typically, this occurs as a result of evaluating
     * a value binding or method binding expression, which utilizes the
     * managed bean facility to instantiate this bean and store it into
     * session scope.</p>
     * 
     * <p>You may customize this method to initialize and cache data values
     * or resources that are required for the lifetime of a particular
     * user session.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here
        
        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("SessionBean1 Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e: new FacesException(e);
        }
        
        // </editor-fold>
        // Perform application initialization that must complete
        // *after* managed components are initialized
        // TODO - add your own initialization code here
        daoFactoryClass = MySqlHbnDAOFactory.HIBERNATE_MY_SQL;
    }

    /**
     * <p>This method is called when the session containing it is about to be
     * passivated.  Typically, this occurs in a distributed servlet container
     * when the session is about to be transferred to a different
     * container instance, after which the <code>activate()</code> method
     * will be called to indicate that the transfer is complete.</p>
     * 
     * <p>You may customize this method to release references to session data
     * or resources that can not be serialized with the session itself.</p>
     */
    @Override
    public void passivate() {
    }

    /**
     * <p>This method is called when the session containing it was
     * reactivated.</p>
     * 
     * <p>You may customize this method to reacquire references to session
     * data or resources that could not be serialized with the
     * session itself.</p>
     */
    @Override
    public void activate() {
    }

    /**
     * <p>This method is called when this bean is removed from
     * session scope.  Typically, this occurs as a result of
     * the session timing out or being terminated by the application.</p>
     * 
     * <p>You may customize this method to clean up resources allocated
     * during the execution of the <code>init()</code> method, or
     * at any later time during the lifetime of the application.</p>
     */
    @Override
    public void destroy() {
    }
    
    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    private Class<? extends DAOFactory> daoFactoryClass;

    public Class<? extends DAOFactory> getDaoFactoryClass() {
        return daoFactoryClass;
    }

    private User currentUser;

    public User getCurrentUser() {
        return currentUser;
    }

    public void setCurrentUser(User currentUser) {
        this.currentUser = currentUser;
    }

    private List<User> currentUsers = new ArrayList<User>();

    public List<User> getCurrentUsers() {
        return currentUsers;
    }

    public void setCurrentUsers(List<User> currentUsers) {
        this.currentUsers = currentUsers;
    }

    private User editableUser;

    public User getEditableUser() {
        return editableUser;
    }

    public void setEditableUser(User editableUser) {
        this.editableUser = editableUser;
    }

    private Map<String, Subject> currentSubjects = new HashMap<String, Subject>();

    public Map<String, Subject> getCurrentSubjects() {
        return currentSubjects;
    }

    public void setCurrentSubjects(Map<String, Subject> currentSubjects) {
        this.currentSubjects = currentSubjects;
    }

    private Test currentTest;

    public Test getCurrentTest() {
        return currentTest;
    }

    public void setCurrentTest(Test currentTest) {
        this.currentTest = currentTest;
    }

    private List<Question> currentTestQuestions = new ArrayList<Question>();

    public void setCurrentTestQuestions(List<Question> currentTestQuestions) {
        this.currentTestQuestions = currentTestQuestions;
    }

    public List<Question> getCurrentTestQuestions() {
        currentTestQuestions.clear();
        if (currentTest != null) {
            Set<Question> qSet = currentTest.getQuestions();
            for (Question question : qSet) {
                currentTestQuestions.add(question);
            }
        } 
        return currentTestQuestions;
    }

    private List<Test> currentTestsList = new ArrayList<Test>();

    public List<Test> getCurrentTestsList() {
        return currentTestsList;
    }

    public void setCurrentTestsList(List<Test> currentTestsList) {
        this.currentTestsList = currentTestsList;
    }
    
    private Question currentQuestion = new Question();

    public Question getCurrentQuestion() {
        return currentQuestion;
    }

    public void setCurrentQuestion(Question currentQuestion) {
        this.currentQuestion = currentQuestion;
    }

    private boolean createNew;

    public boolean isCreateNew() {
        return createNew;
    }

    public void setCreateNew(boolean createNew) {
        this.createNew = createNew;
    }

    private boolean editMode;

    public boolean isEditMode() {
        return editMode;
    }

    public void setEditMode(boolean editMode) {
        this.editMode = editMode;
    }

    public boolean isViewMode() {
        return !editMode;
    }

    public void setViewMode(boolean viewMode) {
        this.editMode = !viewMode;
    }

    private boolean newTest;

    public boolean isNewTest() {
        return newTest;
    }

    public void setNewTest(boolean newTest) {
        this.newTest = newTest;
    }

    private List<Material> currentMaterials = new ArrayList<Material>();

    public List<Material> getCurrentMaterials() {
        return currentMaterials;
    }

    public void setCurrentMaterials(List<Material> currentMaterials) {
        this.currentMaterials = currentMaterials;
    }

    private StudyProgram currentProgram;

    public StudyProgram getCurrentProgram() {
        return currentProgram;
    }

    public void setCurrentProgram(StudyProgram currentProgram) {
        this.currentProgram = currentProgram;
    }

    private List<StudyProgram> currentPrograms;

    public List<StudyProgram> getCurrentPrograms() {
        return currentPrograms;
    }

    public void setCurrentPrograms(List<StudyProgram> currentPrograms) {
        this.currentPrograms = currentPrograms;
    }

    private List<Student> currentStudents;

    public List<Student> getCurrentStudents() {
        return currentStudents;
    }

    public void setCurrentStudents(List<Student> currentStudents) {
        this.currentStudents = currentStudents;
    }

    private Student currentStudent;

    public Student getCurrentStudent() {
        return currentStudent;
    }

    public void setCurrentStudent(Student currentStudent) {
        this.currentStudent = currentStudent;
    }

    private boolean assignProgramMode;

    public boolean isAssignProgramMode() {
        return assignProgramMode;
    }

    public void setAssignProgramMode(boolean assignProfileMode) {
        this.assignProgramMode = assignProfileMode;
    }

    private TestHelper testHelper;

    public TestHelper getTestHelper() {
        return testHelper;
    }

    public void setTestHelper(TestHelper testHelper) {
        this.testHelper = testHelper;
    }
  
}
